fix(ui-kit): give PaginationLink aria-disabled a real visual/interaction effect - #8359
Conversation
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
…ction effect PaginationLink renders an <a>, which has no native disabled attribute, and applied no styling keyed off aria-disabled — so the five miner-ui routes that set aria-disabled at page boundaries got only a screen-reader signal, with the link staying fully opaque, hover-active, and pointer-interactive. Adds aria-disabled:pointer-events-none aria-disabled:opacity-50 at the PaginationLink level (inherited by PaginationPrevious/PaginationNext), matching the aria-disabled: styling convention sidebar.tsx and calendar.tsx already use, with a class-list regression test. Closes JSONbored#8307
|
Tip ✅ LoopOver review result - approve/merge recommendedReview updated: 2026-07-24 10:55:17 UTC
Review summary Nits — 3 non-blocking
Decision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionAddressed Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Visual preview
Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy. Scroll preview
A short scroll-through clip (desktop) — click either thumbnail to open the full animation. Evidence for scroll-linked behavior a single screenshot can't show. 🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|


Summary
PaginationLinkrenders an<a>, which has no nativedisabledattribute, and applied no styling keyed offaria-disabled— so the fiveapps/loopover-miner-uiroutes that setaria-disabledon the boundaryPaginationPrevious/PaginationNext(run-history.tsx,ledgers.tsx,portfolio.tsx,ranked-candidates.tsx,attempts.tsx) got only a screen-reader signal: the link stayed fully opaque, kept its ghost/outline hover state, and remained pointer-interactive.aria-disabled:pointer-events-none aria-disabled:opacity-50toPaginationLink's class composition (inherited byPaginationPrevious/PaginationNext, which both delegate to it), matching the exactaria-disabled:styling conventionsidebar.tsx(sidebarMenuButtonVariants/SidebarMenuSubButton) andcalendar.tsxalready use.isActive/aria-currentbehavior and every consumer's existingaria-disabled={...}usage are untouched —pagination.tsx-only styling fix.pagination.test.tsx(this component's first test): asserts anaria-disabledPaginationLink/PaginationPrevious/PaginationNextcarries the disabled-styling classes and thataria-currentis unchanged.Closes #8307
Scope
type(scope): short summaryConventional Commit format, for examplefix(api): restore profile access checks.CONTRIBUTING.mdand does not reintroduce GitHub Pages, VitePress,site/, orCNAME.Closes #123) — a linked open issue is required for every contributor PR.Validation
git diff --checknpm run actionlintnpm run typechecknpm run test:coveragelocally;codecov/patchrequires ≥99% coverage of the lines AND branches you changed (aim for 100% on your diff so CI variance does not fail near the threshold). Global coverage is a non-blocking trend with a loose 90% backstop, not the gate.npm run test:workersnpm run build:mcpnpm run test:mcp-packnpm run ui:openapi:checknpm run ui:lintnpm run ui:typechecknpm run ui:buildnpm audit --audit-level=moderateIf any required check was skipped, explain why:
packages/loopover-ui-kit/**(one class-composition line + one new test).packages/loopover-ui-kitis not in the rootvitest.config.tscoverage.includeand is not Codecov-gated (its ownvitest.config.ts: the acceptance signal is the suite running and passing, not a percentage), sotest:coverage/codecov/patchdo not apply;actionlint,test:workers,build:mcp/test:mcp-pack,ui:openapi:check, andnpm auditare not exercised by a ui-kit-only class change. Locally verified in the package:npm test(4 files / 22 tests, incl. the 3 new),tsc --noEmit, andprettier --checkon the touched files all pass.Safety
UI Evidencesection below with JPG/JPEG or PNG screenshots arranged as organized, captioned, clickable thumbnails. SVG screenshots are not used as review evidence. Review-only screenshots or recordings are not committed to the repository.UI Evidence
The rendered change is scoped to the
aria-disabled="true"state of a pagination control (a boundaryPaginationPrevious/PaginationNext), which no ui-kit consumer could exercise before this fix because noaria-disabled:styling existed:aria-disabledarrow renders atopacity-50withpointer-events-none(hover highlight and clicks suppressed), i.e. the standard dimmed-disabled cue already shown bysidebar.tsx/calendar.tsx'saria-disabled:elements.The effect is the exact
aria-disabled:opacity-50/aria-disabled:pointer-events-noneutility pair those two sibling components already ship, so it inherits their established visual treatment rather than introducing a new one. The machine-checkable evidence is the class-list regression testpagination.test.tsx(part of this PR), which asserts the disabled-styling classes are present onPaginationLink/PaginationPrevious/PaginationNextand thataria-currentis unchanged — the same class-list-assertion evidence conventionstate-views.test.tsx/theme-toggle.test.tsxuse for ui-kit variant guarantees.Notes
PaginationLinklevel, not duplicated intoPaginationPrevious/PaginationNext, since both delegate to it — mirrors the "AccordionTrigger has no focus-visible indicator, unlike every other interactive control in ui-kit #7015 unlike every other X in ui-kit" consistency shape.